package com.briup.day04;

import java.util.Scanner;

/**
 * 方法的调用与参数传递
 */
public class MethodInvoke {
    public static void main(String[] args) {
        // 递归：
        // 实现输入一个n，查看斐波那契数列中第n位的值是什么？
        // 1、1、2、3、5、8、13、21、34、55、89....
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入数列的项：");
        System.out.println("该项的结果值为:" + fibonacci(sc.nextInt()));

        // 假设你要去查询 电脑桌面上所有带.txt或.docx或.doc结尾的文本文件，将这些文件列举出来
        // 此时对于这种需要穷举，并且穷举判断的逻辑都一致，并且存在固定的出口的问题，
        // 我们就可以通过方法的递归来实现该问题，使用递归能够降低一部分的代码冗余
    }

    // 递归调用，必须存在出口，否则会造成死循环，并且导致JVM栈溢出
    // JVM的栈空间长度是有限的
    private static int fibonacci(int n) {
        if (n <= 0) {
            System.out.println("您输入的位数有误");
            return 0;
        }
        if (n == 1 || n == 2) {
            return 1;
        }
        // 从第三项开始，其值等于前两项之和
        return fibonacci(n - 1) + fibonacci(n - 2);
    }

    private static void test() {
        int a = 100, b = 20;
        // 调用swap方法时，给方法传入的数据是，本方法变量指向空间中的值的副本
        swap(a, b);
        // 输出main方法中的结果
        System.out.printf("main方法中：a = %s , b = %s%n", a, b);
    }

    private static void swap(int a, int b) {
        // 交换变量a和变量b的值
        // 方法1：使用临时变量
        /*int temp = a;
        a = b;
        b = temp;*/
        // 方法2：使用^异或，当a和b的值相同时，无法使用，结果会变成0
        a = a ^ b;
        // b = a ^ b ^ b = a
        b = a ^ b;
        // a = a ^ b = a ^ b ^ a = b
        a = a ^ b;
        // 输出swap结果
        System.out.printf("swap方法中：a = %s , b = %s%n", a, b);
        System.out.println();
    }
}
